import logging

from info.utils.comment import user_login_data
from info.models import User, News, Category
from . import index_blu
from flask import render_template, current_app, session, request, jsonify, g
from info import constants, response_code


@index_blu.route('/')
@user_login_data
def index():
    """主页
    1.从session中，读取用户登录信息user_id
    2.查询user_id对应的user信息
    3 查询新闻点击排行
    构造渲染模板的数据
    响应渲染之后的主页
    """
    # 1 从session中, 读取用户登录信息的user_id
    # user_id = session.get('user_id', None)
    # 2 查询user_id 对应的user信息
    # user = None
    # if user_id:
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         logging.error(e)

    # g.user 已经在装饰器中定义好了，作为上文存在，这里只需要读取下文
    user = g.user


    # 3 查询新闻点击排行
    #   查询主页新闻数据
    news_clicks = None
    categories = None
    try:
        news_clicks = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
        categories = Category.query.all()
    except Exception as e:
        logging.error(e)

    # 构造渲染模板的数据(上下文)
    context = {
        # to_dict 是返回处理之后的数据
        # 三元运算符： 如果有'user' 将user.to_dict()赋值给'user', 反之,给 'user' 赋值 None
        'user':user.to_dict() if user else None,
        'news_clicks':news_clicks,
        'categories': categories
    }

    # 响应主页模板
    # 注意: render_template 默认会从 templates 中查找模板
    return render_template('news/index.html', context=context)
# 返回网站title 图标

@index_blu.route('/favicon.ico')
def favicon():
    return current_app.send_static_file('news/favicon.ico')


# http://127.0.0.1:5000/news_list?cid=1&page=2&per_page=10
@index_blu.route('/news_list')
def index_news_list():
    """主页新闻列表
    1.接受参数：新闻分类id, 当前第几页，每页多少条数据
    2.校验参数：参数是否齐全，参数是否都为整数
    3.根据参数进行分页查询
    4.构造响应的数据
    5.返回响应的数据
    """
    # 1 接受参数：新闻分类id  当前第几页，每页多少条数据
    cid = request.args.get('cid', '1')
    page = request.args.get('page', '1')
    per_page = request.args.get('per_page', '10')

    # 2 校验参数：参数是否齐全，参数是否都为整数
    if not all([cid, page, per_page]):
        return jsonify(errno=response_code.RET.PARAMERR, errmsg='缺少参数')

    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=response_code.RET.PARAMERR, errmsg='参数错误')


    # 3 根据参数进行分页查询：必须查询对应cid 分类的数据
    try:
        if cid == 1:
            # 最新的分类：查询所有的新闻数据，根据新闻create_time 倒序，分页
            paginate = News.query.filter(News.status == 0).order_by(News.create_time.desc()).paginate(page, per_page, False)
                                        # 判断新闻的审核状态是否审核通过　News,status == 0 :　0表示通过审核
        else:
            # 对指定类型的新闻进行查询，排序和分页
            paginate = News.query.filter(News.category_id == cid, News.status == 0).order_by(News.create_time.desc()).paginate(page, per_page, False)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=response_code.RET.DBERR, errmsg='查询数据失败')


    # 4 构造响应的数据
    total_page = paginate.pages  # 总页数
    current_page = paginate.page  # 当前页
    news_list = paginate.items  # 当期页的数据列表   news_list = [news, news ]

    # news_dict_list = [{}, {}]
    news_dict_list = []
    for news in news_list:
        news_dict_list.append((news.to_basic_dict()))


    # 5  返回响应的素具
    return jsonify(errno=response_code.RET.OK, errmsg='OK', cid=cid, current_page=current_page,total_page=total_page, news_dict_list=news_dict_list)













